/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package carreras.datos;

import carreras.entidades.CatCorredorAuto;
import carreras.entidades.Competencia;
import carreras.entidades.CorredorAuto;
import carreras.entidades.Torneo;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 *
 * @author Fanky10 <fanky10@gmail.com>
 */
public class DataCorredorAuto extends data.Data {
    public CatCorredorAuto getAll() throws SQLException{
        final CatCorredorAuto reto = new CatCorredorAuto();
        final String query  = "select ca.numero_designado as numero,"//datos ca
                + " a.id id_auto, a.patente,"//datos auto
                + " c.id id_corredor, c.nombre,c.apellido,c.dni"//datos corredor
                + " FROM corredor_auto ca"
                + " INNER JOIN auto a ON a.id = ca.id_auto"
                + " INNER JOIN corredor c ON c.id = ca.id_corredor";
        ResultSet rs = db.getResultSet(query);
        while(rs.next()){
            carreras.entidades.Auto a = new carreras.entidades.Auto(rs.getInt("id_auto"), rs.getString("patente"));
            carreras.entidades.Corredor c = new carreras.entidades.Corredor(rs.getInt("id_corredor"), rs.getString("nombre"), rs.getString("apellido"), rs.getInt("dni"));
            carreras.entidades.CorredorAuto ca = new CorredorAuto(rs.getInt("numero"), a, c);
            reto.add(ca);
            
        }
        return reto;
    }
    public void addCorredorAuto(CorredorAuto ca) throws SQLException{
        final String insert_corredor  = "INSERT INTO corredor (id,nombre,apellido,dni) VALUES ("
                + "null,"
                + ""+data.DBConnector.adapta_string(ca.getCorredor().getNombre())+","
                + ""+data.DBConnector.adapta_string(ca.getCorredor().getApellido())+","
                + ""+data.DBConnector.traduce_nro(ca.getCorredor().getDni())
                +")";
        final String insert_auto  = "INSERT INTO auto (id,patente) VALUES ("
                + "null,"
                + ""+data.DBConnector.adapta_string(ca.getAuto().getPatente())
                +")";
        final String insert_corredor_auto = "INSERT INTO corredor_auto (id_corredor,id_auto,numero_designado)VALUES("
                + "(select max(id) from corredor),(select max(id) from auto),null);";
        //final String nro_desig = "SELECT max(numero_designado) nro from corredor_auto";
        final String nro_desig = "SELECT max(numero_designado) nro, id_auto, id_corredor from corredor_auto";
        try{
            db.startTransaction();
            db.executeUpdate(insert_corredor);
            db.executeUpdate(insert_auto);
            db.executeUpdate(insert_corredor_auto);
            ResultSet rs = db.getResultSet(nro_desig);
            while(rs.next()){
                ca.setNumero_asignado(rs.getInt("nro"));
                //los id's de auto y corredor los seteamos
                ca.getCorredor().setId(rs.getInt("id_corredor"));
                ca.getAuto().setId(rs.getInt("id_auto"));
            }
            db.commitTransaction();
            
        }catch(SQLException ex){
            db.rollbackTransaction();
            System.err.println("Operation Rollbacked!");
            throw ex;
        }
    }

    public CatCorredorAuto getTodosMenos(CatCorredorAuto cat_cc) throws SQLException{final CatCorredorAuto reto = new CatCorredorAuto();
        StringBuilder sb = new StringBuilder();
        if(!cat_cc.isEmpty()){
            sb.append(" numero_designado not in (");
            for(int i=0;i<cat_cc.size();i++){
                sb.append(String.valueOf(cat_cc.get(i).getNumero_asignado()));
                sb.append((i!=cat_cc.size()-1?",":""));
            }
            sb.append(")");
        }else{
            sb.append("true");
        }
        final String query  = "select ca.numero_designado as numero,"//datos ca
                + " a.id id_auto, a.patente,"//datos auto
                + " c.id id_corredor, c.nombre,c.apellido,c.dni"//datos corredor
                + " FROM corredor_auto ca"
                + " INNER JOIN auto a ON a.id = ca.id_auto"
                + " INNER JOIN corredor c ON c.id = ca.id_corredor"
                + " WHERE "+sb.toString();
        ResultSet rs = db.getResultSet(query);
        while(rs.next()){
            carreras.entidades.Auto a = new carreras.entidades.Auto(rs.getInt("id_auto"), rs.getString("patente"));
            carreras.entidades.Corredor c = new carreras.entidades.Corredor(rs.getInt("id_corredor"), rs.getString("nombre"), rs.getString("apellido"), rs.getInt("dni"));
            carreras.entidades.CorredorAuto ca = new CorredorAuto(rs.getInt("numero"), a, c);
            reto.add(ca);
            
        }
        return reto;
    }
    
    //(int numero_asignado,Auto auto, Corredor corredor, Categoria categoria)
    
    public CatCorredorAuto getAllCorredorAutoCategoria(Competencia competencia_actual) throws SQLException{
        CatCorredorAuto cats = new CatCorredorAuto();
        //una lista de auto-corredor con su tiempo minimo (decisivo)
        String dtt_tiempos = "DROP TEMPORARY TABLE IF EXISTS tt_tiempos";
        String ctt_tiempos="CREATE TEMPORARY TABLE tt_tiempos("
                + " select ca.id_auto, a.patente, "
                + " ca.id_corredor,c.nombre,c.apellido, c.dni,"
                + " numero_designado numero,min(tiempo) tcateg"
                + " from  carril_carrera cc"
                + " inner join corredor_auto ca on ca.id_auto=cc.id_auto and ca.id_corredor=cc.id_corredor"
                + " inner join carrera car on cc.id_carrera = car.id"
                + " inner join auto a on cc.id_auto = a.id"
                + " inner join corredor c on cc.id_auto = a.id"
                + " WHERE car.id_competencia = "+competencia_actual.getId()+" and tipo_tiempo = 3"
                + " group by ca.id_auto,ca.id_corredor);";
        String dtt_categ = "DROP TEMPORARY TABLE IF EXISTS tt_tiempos";
        String ctt_categ ="create temporary table tt_categ("
                + " select tt.*, c.id id_categoria,c.descripcion desc_categ, c.tiempo_maximo from tt_tiempos tt"
                + " inner join categoria c on c.tiempo_maximo<=tt.tcateg"
                + " order by tiempo_maximo desc);";
        String query = "select * from tt_categ group by id_auto,id_corredor";
        db.executeUpdate(dtt_tiempos);
        db.executeUpdate(dtt_categ);
        db.executeUpdate(ctt_tiempos);
        db.executeUpdate(ctt_categ);
        ResultSet rs = db.getResultSet(query);
        while(rs.next()){
            carreras.entidades.Auto a = new carreras.entidades.Auto(rs.getInt("id_auto"), rs.getString("patente"));
            carreras.entidades.Corredor c = new carreras.entidades.Corredor(rs.getInt("id_corredor"), rs.getString("nombre"), rs.getString("apellido"), rs.getInt("dni"));
            carreras.entidades.Categoria categ = new carreras.entidades.Categoria(rs.getInt("id_categoria"),rs.getString("desc_categ"),rs.getFloat("tiempo_maximo"));
            carreras.entidades.CorredorAuto ca = new CorredorAuto(rs.getInt("numero"), a, c, categ);
            cats.add(ca);
        }
        
        
        return cats;
    }

    public CatCorredorAuto getAllCorredorAutoCategoria(Torneo t) throws SQLException{
        CatCorredorAuto cats = new CatCorredorAuto();
        //una lista de auto-corredor con su tiempo minimo (decisivo)
        String dtt_tiempos = "DROP TEMPORARY TABLE IF EXISTS tt_tiempos";
        String ctt_tiempos="CREATE TEMPORARY TABLE tt_tiempos("
                + " select ca.id_auto, a.patente, "
                + " ca.id_corredor,c.nombre,c.apellido, c.dni,"
                + " numero_designado numero,min(tiempo) tcateg"
                + " from  carril_carrera cc"
                + " inner join corredor_auto ca on ca.id_auto=cc.id_auto and ca.id_corredor=cc.id_corredor"
                + " inner join carrera car on cc.id_carrera = car.id"
                + " inner join auto a on cc.id_auto = a.id"
                + " inner join corredor c on cc.id_auto = a.id"
                + " inner join competencia comp on car.id_competencia = comp.id"
                + " WHERE comp.id_torneo = "+t.getId()+" and tipo_tiempo = 3"
                + " group by ca.id_auto,ca.id_corredor);";
        String dtt_categ = "DROP TEMPORARY TABLE IF EXISTS tt_tiempos";
        String ctt_categ ="create temporary table tt_categ("
                + " select tt.*, c.id id_categoria,c.descripcion desc_categ, c.tiempo_maximo from tt_tiempos tt"
                + " inner join categoria c on c.tiempo_maximo<=tt.tcateg"
                + " order by tiempo_maximo desc);";
        String query = "select * from tt_categ group by id_auto,id_corredor";
        db.executeUpdate(dtt_tiempos);
        db.executeUpdate(dtt_categ);
        db.executeUpdate(ctt_tiempos);
        db.executeUpdate(ctt_categ);
        ResultSet rs = db.getResultSet(query);
        while(rs.next()){
            carreras.entidades.Auto a = new carreras.entidades.Auto(rs.getInt("id_auto"), rs.getString("patente"));
            carreras.entidades.Corredor c = new carreras.entidades.Corredor(rs.getInt("id_corredor"), rs.getString("nombre"), rs.getString("apellido"), rs.getInt("dni"));
            carreras.entidades.Categoria categ = new carreras.entidades.Categoria(rs.getInt("id_categoria"),rs.getString("desc_categ"),rs.getFloat("tiempo_maximo"));
            carreras.entidades.CorredorAuto ca = new CorredorAuto(rs.getInt("numero"), a, c, categ);
            cats.add(ca);
        }
        
        
        return cats;
    }

}
